#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
快速数据库配置脚本
使用命令行参数快速设置数据库连接信息

用法:
python quick_db_setup.py --host localhost --port 3306 --user myuser --password mypass --database mydb

保留现有配置:
python quick_db_setup.py --host localhost --port 3306 --user myuser --password mypass --database mydb --preserve-config

注意: 使用 --preserve-config 参数可以在更换数据库时保留微信配置等重要信息
"""

import argparse
import os
import sys

def read_existing_config():
    """读取现有的.env配置"""
    config = {}
    if os.path.exists('.env'):
        with open('.env', 'r', encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                if line and not line.startswith('#') and '=' in line:
                    key, value = line.split('=', 1)
                    config[key] = value
    return config

def create_env_file(host, port, user, password, database, preserve_config=False):
    """创建环境配置文件"""
    existing_config = {}
    if preserve_config:
        existing_config = read_existing_config()
    
    env_content = f"""# 环境配置文件 - 快速生成
# 生成时间: {os.popen('date').read().strip()}
{f"# 保留现有配置模式" if preserve_config else ""}

# Flask 环境配置
FLASK_ENV=development
SECRET_KEY={existing_config.get('SECRET_KEY', 'your-super-secret-key-here-change-this-in-production')}

# 服务器配置
HOST=0.0.0.0
PORT=5000

# 数据库配置 - MySQL
MYSQL_HOST={host}
MYSQL_PORT={port}
MYSQL_USER={user}
MYSQL_PASSWORD={password}
MYSQL_DATABASE={database}

# 数据库连接池配置
DB_POOL_SIZE=10
DB_POOL_TIMEOUT=20
DB_POOL_RECYCLE=3600
DB_MAX_OVERFLOW=0
DB_ECHO=false

# JWT配置
JWT_SECRET_KEY={existing_config.get('JWT_SECRET_KEY', 'jwt-secret-key-change-this-in-production')}
JWT_EXPIRES_HOURS=168

# 文件上传配置
UPLOAD_FOLDER=uploads
MAX_CONTENT_LENGTH=16777216

# 日志配置
LOG_LEVEL=INFO
LOG_FILE=logs/app.log

# 微信配置（可选）
WECHAT_APPID={existing_config.get('WECHAT_APPID', 'your-wechat-appid')}
WECHAT_SECRET={existing_config.get('WECHAT_SECRET', 'your-wechat-secret')}

# 跨域配置
CORS_ORIGINS=http://localhost:8080,http://127.0.0.1:8080

# 微信支付配置（可选）
WECHAT_APP_ID={existing_config.get('WECHAT_APP_ID', 'your-wechat-app-id')}
WECHAT_MCH_ID={existing_config.get('WECHAT_MCH_ID', 'your-merchant-id')}
WECHAT_PAY_KEY={existing_config.get('WECHAT_PAY_KEY', 'your-api-key')}
WECHAT_NOTIFY_URL={existing_config.get('WECHAT_NOTIFY_URL', 'http://your-domain.com/api/v1/payments/wechat/notify')}

# Redis配置（可选）
REDIS_URL=redis://localhost:6379/0

# 安全配置
WTF_CSRF_SECRET_KEY={existing_config.get('WTF_CSRF_SECRET_KEY', 'csrf-secret-key-change-in-production')}
SEND_FILE_MAX_AGE_DEFAULT=31536000

# 开发模式配置
DEBUG=True
TESTING=False
"""
    
    # 写入.env文件
    with open('.env', 'w', encoding='utf-8') as f:
        f.write(env_content)
    
    if preserve_config and existing_config:
        print("✅ .env 配置文件已创建（保留现有配置）")
        preserved_keys = ['WECHAT_APPID', 'WECHAT_SECRET', 'SECRET_KEY', 'JWT_SECRET_KEY']
        for key in preserved_keys:
            if key in existing_config and existing_config[key] not in ['', f'your-{key.lower().replace("_", "-")}']:
                if key.startswith('WECHAT'):
                    masked = existing_config[key][:8] + '****' + existing_config[key][-4:] if len(existing_config[key]) > 12 else '****'
                    print(f"  保留 {key}: {masked}")
                else:
                    print(f"  保留 {key}: ****")
    else:
        print("✅ .env 配置文件已创建")

def test_connection(host, port, user, password, database):
    """测试数据库连接"""
    print("🔍 测试数据库连接...")
    
    try:
        import pymysql
        
        connection = pymysql.connect(
            host=host,
            port=int(port),
            user=user,
            password=password,
            database=database,
            charset='utf8mb4'
        )
        
        with connection.cursor() as cursor:
            cursor.execute("SELECT 1")
            result = cursor.fetchone()
        
        connection.close()
        print("✅ 数据库连接测试成功")
        return True
        
    except ImportError:
        print("⚠️ PyMySQL 未安装，跳过连接测试")
        print("请运行: pip install pymysql")
        return True
        
    except Exception as e:
        print(f"❌ 数据库连接测试失败: {e}")
        return False

def main():
    parser = argparse.ArgumentParser(description='快速配置数据库连接信息')
    parser.add_argument('--host', required=True, help='数据库地址')
    parser.add_argument('--port', default='3306', help='端口号 (默认: 3306)')
    parser.add_argument('--user', required=True, help='用户名')
    parser.add_argument('--password', required=True, help='密码')
    parser.add_argument('--database', required=True, help='数据库名')
    parser.add_argument('--no-test', action='store_true', help='跳过连接测试')
    parser.add_argument('--preserve-config', action='store_true', help='保留现有的微信等重要配置')
    
    args = parser.parse_args()
    
    print("🚀 快速数据库配置工具")
    print("=" * 40)
    print(f"数据库地址: {args.host}")
    print(f"端口: {args.port}")
    print(f"用户名: {args.user}")
    print(f"数据库名: {args.database}")
    print("=" * 40)
    
    # 测试连接（除非明确跳过）
    if not args.no_test:
        if not test_connection(args.host, args.port, args.user, args.password, args.database):
            print("❌ 连接测试失败，请检查数据库配置")
            sys.exit(1)
    
    # 显示保留配置警告
    if args.preserve_config:
        print("🛡️ 启用配置保留模式")
    elif os.path.exists('.env'):
        print("⚠️ 检测到现有配置文件")
        print("💡 使用 --preserve-config 参数可以保留微信等重要配置")
    
    # 创建配置文件
    create_env_file(args.host, args.port, args.user, args.password, args.database, args.preserve_config)
    
    print("\n🎉 数据库配置完成！")
    print("\n📋 生成的配置信息：")
    print(f"  MYSQL_HOST={args.host}")
    print(f"  MYSQL_PORT={args.port}")
    print(f"  MYSQL_USER={args.user}")
    print(f"  MYSQL_DATABASE={args.database}")
    
    print("\n🚀 下一步操作：")
    print("1. 运行: python run.py")
    print("2. 访问: http://localhost:5000/health")
    print("3. API文档: http://localhost:5000/apidocs/")

if __name__ == '__main__':
    main() 